﻿using ExcellentProjectPlus.Seguridades.Servicios.Estudiantes;
using ExcellentProjectPlus.Dominio.Seguridades.Entidades;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;
using ExcellentProjectPlus.Dominio.Seguridades.Servicios.Personas;
using ExcellentProjectPlus.Dominio.Seguridad.Entidades;

namespace ExcellentProjectPlus.Seguridades.Estudiantes
{
    public class ServicioDeGestionDeEstudiantes : IServicioDeGestionDeEstudiantes
    {
        #region Propiedades
        IServicioDeAdministracionDeEstudiantes _servicioDeAdministracionDeEstudiantes;
        IServicioDeAdministracionDePersonas _servicioDeAdministracionDePersonas;
        #endregion

        #region Constructores
        public ServicioDeGestionDeEstudiantes(IServicioDeAdministracionDeEstudiantes servicioDeAdministracionDeEstudiantes,
            IServicioDeAdministracionDePersonas servicioDeAdministracionDePersonas)
        {
            _servicioDeAdministracionDeEstudiantes = servicioDeAdministracionDeEstudiantes;
            _servicioDeAdministracionDePersonas = servicioDeAdministracionDePersonas;
        }
        #endregion

        public IEnumerable<Estudiante> ObtenerEstudiantes()
        {
            IEnumerable<Estudiante> resultado = null;
            var trxOptions = new TransactionOptions();
            trxOptions.IsolationLevel = IsolationLevel.ReadUncommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeEstudiantes.ObtenerEstudiantes();
                transaccion.Complete();
            }

            return resultado;
        }

        public Estudiante ObtenerEstudiantePorId(int id)
        {
            Estudiante resultado = null;
            var trxOptions = new TransactionOptions();
            trxOptions.IsolationLevel = IsolationLevel.ReadCommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeEstudiantes.ObtenerEstudiantePorId(id);
                transaccion.Complete();
            }
            return resultado;
        }

        public void AgregarEstudiante(Estudiante estudiante)
        {
            _servicioDeAdministracionDeEstudiantes.AgregarEstudiante(estudiante);
        }
        public void ModificarEstudiante(Estudiante estudiante)
        {
            _servicioDeAdministracionDeEstudiantes.ModificarEstudiante(estudiante);
        }
        public void EliminarEstudiante(Estudiante estudiante)
        {
            _servicioDeAdministracionDeEstudiantes.EliminarEstudiante(estudiante);
        }

        public Persona ObtenerRepresentanteDeEstudiante(int id)
        {
            Persona resultado = null;
            var trxOptions = new TransactionOptions();
            trxOptions.IsolationLevel = IsolationLevel.ReadCommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                var estudiante = _servicioDeAdministracionDeEstudiantes.ObtenerEstudiantePorId(id);
                resultado = _servicioDeAdministracionDePersonas.ObtenerPersonaPorId(estudiante.Representante);
                transaccion.Complete();
            }
            return resultado;
        }


        public IEnumerable<InformacionEstudiante> ObtenerInformacionEstudiantes()
        {
            return _servicioDeAdministracionDeEstudiantes.ObtenerInformacionEstudiantes();
        }

        public Estudiante ObtenerEstudiantePorNombreUsuario(string usuario)
        {
            return _servicioDeAdministracionDeEstudiantes.ObtenerEstudiantePorNombreUsuario(usuario);
        }
    }
}
